import { useRoutes } from '../stores/routes'
import type { RouteRecordRaw } from 'vue-router'
import { dynamicRoutes } from '/@/router/route'
import type { Component } from 'vue'
// 后端控制路由

type recordComponent = {
  [x: string]: Component
}
/**
 * 获取目录下的 .vue、.tsx 全部文件
 * @see https://cn.vitejs.dev/guide/features.html#json
 */

// ----------------------- 这段是自动从组件库获取文件, 可以不改动 --------------------------------------
/**
 * 把import.meta.glob获取出来的path修改成与url对应的key
 * @param imports import.meta.glob获取的数据
 * @returns 处理后的数据
 */
const getComponents = (imports: recordComponent): recordComponent => {
  const views: recordComponent = {}
  for (const path in imports) {
    const url = path.replaceAll(
      /\.\.\/components\/layout\/router-view\/|\.\.\/views|\/index\.vue|\.vue|\.tsx/g,
      ''
    )
    views[url] = imports[path]
  }
  return views
}

/** layout组件 */
const layoutModules = getComponents(
  import.meta.glob('../components/layout/router-view/*.{vue,tsx}')
)

/** views组件 */
const viewsModules = getComponents(import.meta.glob('../views/**/*.{vue,tsx}'))

/** 组装后包含layout和views的组件库 */
const dynamicViewsModules = Object.assign(layoutModules, viewsModules)
// console.log(dynamicViewsModules)
// ----------------------- 这段是自动从组件库获取文件, 可以不改动 --------------------------------------

// ----------------------- 下面是生成路由的逻辑, 可以修改 --------------------------------------

/**
 * 获取后端返回路由并处理
 * @returns 从后端
 */
export async function initBackEndControlRoutes(): Promise<RouteRecordRaw[]> {
  const routesStore = useRoutes()
  // 获取路由菜单数据
  const backRoutesList = await routesStore.getRoutes()

  // 执行component组装
  // 处理路由（component），替换 dynamicRoutes（/@/router/route）第一个顶级 children 的路由
  const router: RouteRecordRaw[] = []
  await backEndRouterTrans(backRoutesList, router)
  dynamicRoutes[0].children = router

  return dynamicRoutes
}

/**
 * 处理后端返回的路由数据
 * @param backRouter 后端路由
 * @param parentRouter 上级路由
 */
function backEndRouterTrans(
  backRouter: BackRouteRecordRaw[],
  parentRouter: RouteRecordRaw[]
) {
  let temporaryRouter: RouteRecordRaw
  for (const item of backRouter) {
    if (!item.children) {
      item.children = []
    }

    // 重新组装前端需要的路由
    temporaryRouter = {
      path: item.uri,
      name: item.code,
      meta: {
        ...JSON.parse(item.extAttr),
        title: item.name,
        isHide: !item.show
        // powers: [],
        // breadcrumbs: []
      },
      children: []
    }

    // 判断url是否有对应组件
    if (item.uri in dynamicViewsModules) {
      // 如果url对应有页面, 直接赋予组件
      temporaryRouter.component = dynamicViewsModules[item.uri]
    } else {
      // 如果没有url对应组件, 检查是否有子页面
      if (item.children.length > 0) {
        // 跳转至首个子页面
        temporaryRouter.redirect = item.children[0].uri
        // 赋予路由父组件
        temporaryRouter.component = dynamicViewsModules.parent
      } else if (temporaryRouter.meta?.isIframe) {
        // 如果是iframe
        temporaryRouter.component = dynamicViewsModules.iframe
      } else {
        // 如果没有子页面, 识别为404
        temporaryRouter.component = dynamicViewsModules['/error']
      }
    }

    // 添加到上级路由
    parentRouter.push(temporaryRouter)

    // 如果本路由存在子路由, 继续遍历
    if (item.children.length > 0) {
      backEndRouterTrans(item.children, temporaryRouter.children)
    }
  }
}
